//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS NetworkFirewall service.
///
/// This is the API Reference for Network Firewall. This guide is for developers who need detailed information about the Network Firewall API actions, data types, and errors.  The REST API requires you to handle connection details, such as calculating signatures, handling request retries, and error handling. For general information about using the Amazon Web Services REST APIs, see Amazon Web Services APIs.  To view the complete list of Amazon Web Services Regions where Network Firewall is available, see Service endpoints and quotas in the Amazon Web Services General Reference.  To access Network Firewall using the IPv4 REST API endpoint: https://network-firewall..amazonaws.com   To access Network Firewall using the Dualstack (IPv4 and IPv6) REST API endpoint: https://network-firewall..aws.api   Alternatively, you can use one of the Amazon Web Services SDKs to access an API that's tailored to the programming language or platform that you're using. For more information, see Amazon Web Services SDKs. For descriptions of Network Firewall features, including and step-by-step instructions on how to use them through the Network Firewall console, see the Network Firewall Developer Guide. Network Firewall is a stateful, managed, network firewall and intrusion detection and prevention service for Amazon Virtual Private Cloud (Amazon VPC). With Network Firewall, you can filter traffic at the perimeter of your VPC. This includes filtering traffic going to and coming from an internet gateway, NAT gateway, or over VPN or Direct Connect. Network Firewall uses rules that are compatible with Suricata, a free, open source network analysis and threat detection engine. Network Firewall supports Suricata version 7.0.3. For information about Suricata, see the Suricata website and the  Suricata User Guide.  You can use Network Firewall to monitor and protect your VPC traffic in a number of ways. The following are just a few examples:    Allow domains or IP addresses for known Amazon Web Services service endpoints, such as Amazon S3, and block all other forms of traffic.   Use custom lists of known bad domains to limit the types of domain names that your applications can access.   Perform deep packet inspection on traffic entering or leaving your VPC.   Use stateful protocol detection to filter protocols like HTTPS, regardless of the port used.   To enable Network Firewall for your VPCs, you perform steps in both Amazon VPC and in Network Firewall. For information about using Amazon VPC, see Amazon VPC User Guide. To start using Network Firewall, do the following:    (Optional) If you don't already have a VPC that you want to protect, create it in Amazon VPC.    In Amazon VPC, in each Availability Zone where you want to have a firewall endpoint, create a subnet for the sole use of Network Firewall.    In Network Firewall, define the firewall behavior as follows:    Create stateless and stateful rule groups, to define the components of the network traffic filtering behavior that you want your firewall to have.    Create a firewall policy that uses your rule groups and specifies additional default traffic filtering behavior.      In Network Firewall, create a firewall and specify your new firewall policy and VPC subnets. Network Firewall creates a firewall endpoint in each subnet that you specify, with the behavior that's defined in the firewall policy.   In Amazon VPC, use ingress routing enhancements to route traffic through the new firewall endpoints.   After your firewall is established, you can add firewall endpoints for new Availability Zones by following the prior steps for the Amazon VPC setup and  firewall subnet definitions. You can also add endpoints to Availability Zones that you're using in the firewall, either for the same VPC  or for another VPC, by following the prior steps for the Amazon VPC setup, and defining the new VPC subnets as VPC endpoint associations.
public struct NetworkFirewall: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the NetworkFirewall client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "NetworkFirewall_20201112",
            serviceName: "NetworkFirewall",
            serviceIdentifier: "network-firewall",
            serviceProtocol: .json(version: "1.0"),
            apiVersion: "2020-11-12",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: NetworkFirewallErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.fips]: .init(endpoints: [
            "ca-central-1": "network-firewall-fips.ca-central-1.amazonaws.com",
            "us-east-1": "network-firewall-fips.us-east-1.amazonaws.com",
            "us-east-2": "network-firewall-fips.us-east-2.amazonaws.com",
            "us-gov-east-1": "network-firewall-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "network-firewall-fips.us-gov-west-1.amazonaws.com",
            "us-west-1": "network-firewall-fips.us-west-1.amazonaws.com",
            "us-west-2": "network-firewall-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Accepts a transit gateway attachment request for Network Firewall. When you accept the attachment request, Network Firewall creates the necessary routing components to enable traffic flow between the transit gateway and firewall endpoints. You must accept a transit gateway attachment to complete the creation of a transit gateway-attached firewall, unless auto-accept is enabled on the transit gateway. After acceptance, use DescribeFirewall to verify the firewall status. To reject an attachment instead of accepting it, use RejectNetworkFirewallTransitGatewayAttachment.  It can take several minutes for the attachment acceptance to complete and the firewall to become available.
    @Sendable
    @inlinable
    public func acceptNetworkFirewallTransitGatewayAttachment(_ input: AcceptNetworkFirewallTransitGatewayAttachmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AcceptNetworkFirewallTransitGatewayAttachmentResponse {
        try await self.client.execute(
            operation: "AcceptNetworkFirewallTransitGatewayAttachment", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Accepts a transit gateway attachment request for Network Firewall. When you accept the attachment request, Network Firewall creates the necessary routing components to enable traffic flow between the transit gateway and firewall endpoints. You must accept a transit gateway attachment to complete the creation of a transit gateway-attached firewall, unless auto-accept is enabled on the transit gateway. After acceptance, use DescribeFirewall to verify the firewall status. To reject an attachment instead of accepting it, use RejectNetworkFirewallTransitGatewayAttachment.  It can take several minutes for the attachment acceptance to complete and the firewall to become available.
    ///
    /// Parameters:
    ///   - transitGatewayAttachmentId: Required. The unique identifier of the transit gateway attachment to accept. This ID is returned in the response when creating a transit gateway-attached firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func acceptNetworkFirewallTransitGatewayAttachment(
        transitGatewayAttachmentId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AcceptNetworkFirewallTransitGatewayAttachmentResponse {
        let input = AcceptNetworkFirewallTransitGatewayAttachmentRequest(
            transitGatewayAttachmentId: transitGatewayAttachmentId
        )
        return try await self.acceptNetworkFirewallTransitGatewayAttachment(input, logger: logger)
    }

    /// Associates the specified Availability Zones with a transit gateway-attached firewall. For each Availability Zone, Network Firewall creates a firewall endpoint to process traffic. You can specify one or more Availability Zones where you want to deploy the firewall. After adding Availability Zones, you must update your transit gateway route tables to direct traffic through the new firewall endpoints. Use DescribeFirewall to monitor the status of the new endpoints.
    @Sendable
    @inlinable
    public func associateAvailabilityZones(_ input: AssociateAvailabilityZonesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateAvailabilityZonesResponse {
        try await self.client.execute(
            operation: "AssociateAvailabilityZones", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates the specified Availability Zones with a transit gateway-attached firewall. For each Availability Zone, Network Firewall creates a firewall endpoint to process traffic. You can specify one or more Availability Zones where you want to deploy the firewall. After adding Availability Zones, you must update your transit gateway route tables to direct traffic through the new firewall endpoints. Use DescribeFirewall to monitor the status of the new endpoints.
    ///
    /// Parameters:
    ///   - availabilityZoneMappings: Required. The Availability Zones where you want to create firewall endpoints. You must specify at least one Availability Zone.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateAvailabilityZones(
        availabilityZoneMappings: [AvailabilityZoneMapping],
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateAvailabilityZonesResponse {
        let input = AssociateAvailabilityZonesRequest(
            availabilityZoneMappings: availabilityZoneMappings, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.associateAvailabilityZones(input, logger: logger)
    }

    /// Associates a FirewallPolicy to a Firewall.  A firewall policy defines how to monitor and manage your VPC network traffic, using a collection of inspection rule groups and other settings. Each firewall requires one firewall policy association, and you can use the same firewall policy for multiple firewalls.
    @Sendable
    @inlinable
    public func associateFirewallPolicy(_ input: AssociateFirewallPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateFirewallPolicyResponse {
        try await self.client.execute(
            operation: "AssociateFirewallPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates a FirewallPolicy to a Firewall.  A firewall policy defines how to monitor and manage your VPC network traffic, using a collection of inspection rule groups and other settings. Each firewall requires one firewall policy association, and you can use the same firewall policy for multiple firewalls.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - firewallPolicyArn: The Amazon Resource Name (ARN) of the firewall policy.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateFirewallPolicy(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        firewallPolicyArn: String,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateFirewallPolicyResponse {
        let input = AssociateFirewallPolicyRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            firewallPolicyArn: firewallPolicyArn, 
            updateToken: updateToken
        )
        return try await self.associateFirewallPolicy(input, logger: logger)
    }

    /// Associates the specified subnets in the Amazon VPC to the firewall. You can specify one subnet for each of the Availability Zones that the VPC spans.  This request creates an Network Firewall firewall endpoint in each of the subnets. To enable the firewall's protections, you must also modify the VPC's route tables for each subnet's Availability Zone, to redirect the traffic that's coming into and going out of the zone through the firewall endpoint.
    @Sendable
    @inlinable
    public func associateSubnets(_ input: AssociateSubnetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateSubnetsResponse {
        try await self.client.execute(
            operation: "AssociateSubnets", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates the specified subnets in the Amazon VPC to the firewall. You can specify one subnet for each of the Availability Zones that the VPC spans.  This request creates an Network Firewall firewall endpoint in each of the subnets. To enable the firewall's protections, you must also modify the VPC's route tables for each subnet's Availability Zone, to redirect the traffic that's coming into and going out of the zone through the firewall endpoint.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - subnetMappings: The IDs of the subnets that you want to associate with the firewall.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateSubnets(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        subnetMappings: [SubnetMapping],
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateSubnetsResponse {
        let input = AssociateSubnetsRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            subnetMappings: subnetMappings, 
            updateToken: updateToken
        )
        return try await self.associateSubnets(input, logger: logger)
    }

    /// Creates an Network Firewall Firewall and accompanying FirewallStatus for a VPC.  The firewall defines the configuration settings for an Network Firewall firewall. The settings that you can define at creation include the firewall policy, the subnets in your VPC to use for the firewall endpoints, and any tags that are attached to the firewall Amazon Web Services resource.  After you create a firewall, you can provide additional settings, like the logging configuration.  To update the settings for a firewall, you use the operations that apply to the settings themselves, for example UpdateLoggingConfiguration, AssociateSubnets, and UpdateFirewallDeleteProtection.  To manage a firewall's tags, use the standard Amazon Web Services resource tagging operations, ListTagsForResource, TagResource, and UntagResource. To retrieve information about firewalls, use ListFirewalls and DescribeFirewall. To generate a report on the last 30 days of traffic monitored by a firewall, use StartAnalysisReport.
    @Sendable
    @inlinable
    public func createFirewall(_ input: CreateFirewallRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateFirewallResponse {
        try await self.client.execute(
            operation: "CreateFirewall", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an Network Firewall Firewall and accompanying FirewallStatus for a VPC.  The firewall defines the configuration settings for an Network Firewall firewall. The settings that you can define at creation include the firewall policy, the subnets in your VPC to use for the firewall endpoints, and any tags that are attached to the firewall Amazon Web Services resource.  After you create a firewall, you can provide additional settings, like the logging configuration.  To update the settings for a firewall, you use the operations that apply to the settings themselves, for example UpdateLoggingConfiguration, AssociateSubnets, and UpdateFirewallDeleteProtection.  To manage a firewall's tags, use the standard Amazon Web Services resource tagging operations, ListTagsForResource, TagResource, and UntagResource. To retrieve information about firewalls, use ListFirewalls and DescribeFirewall. To generate a report on the last 30 days of traffic monitored by a firewall, use StartAnalysisReport.
    ///
    /// Parameters:
    ///   - availabilityZoneChangeProtection: Optional. A setting indicating whether the firewall is protected against changes to its Availability Zone configuration. When set to TRUE, you cannot add or remove Availability Zones without first disabling this protection using UpdateAvailabilityZoneChangeProtection. Default value: FALSE
    ///   - availabilityZoneMappings: Required. The Availability Zones where you want to create firewall endpoints for a transit gateway-attached firewall. You must specify at least one Availability Zone. Consider enabling the firewall in every Availability Zone where you have workloads to maintain Availability Zone independence. You can modify Availability Zones later using AssociateAvailabilityZones or DisassociateAvailabilityZones, but this may briefly disrupt traffic. The AvailabilityZoneChangeProtection setting controls whether you can make these modifications.
    ///   - deleteProtection: A flag indicating whether it is possible to delete the firewall. A setting of TRUE indicates that the firewall is protected against deletion. Use this setting to protect against accidentally deleting a firewall that is in use. When you create a firewall, the operation initializes this flag to TRUE.
    ///   - description: A description of the firewall.
    ///   - enabledAnalysisTypes: An optional setting indicating the specific traffic analysis types to enable on the firewall.
    ///   - encryptionConfiguration: A complex type that contains settings for encryption of your firewall resources.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it.
    ///   - firewallPolicyArn: The Amazon Resource Name (ARN) of the FirewallPolicy that you want to use for the firewall.
    ///   - firewallPolicyChangeProtection: A setting indicating whether the firewall is protected against a change to the firewall policy association. Use this setting to protect against accidentally modifying the firewall policy for a firewall that is in use. When you create a firewall, the operation initializes this setting to TRUE.
    ///   - subnetChangeProtection: A setting indicating whether the firewall is protected against changes to the subnet associations. Use this setting to protect against accidentally modifying the subnet associations for a firewall that is in use. When you create a firewall, the operation initializes this setting to TRUE.
    ///   - subnetMappings: The public subnets to use for your Network Firewall firewalls. Each subnet must belong to a different Availability Zone in the VPC. Network Firewall creates a firewall endpoint in each subnet.
    ///   - tags: The key:value pairs to associate with the resource.
    ///   - transitGatewayId: Required when creating a transit gateway-attached firewall. The unique identifier of the transit gateway to attach to this firewall. You can provide either a transit gateway from your account or one that has been shared with you through Resource Access Manager.  After creating the firewall, you cannot change the transit gateway association. To use a different transit gateway, you must create a new firewall.  For information about creating firewalls, see CreateFirewall. For specific guidance about transit gateway-attached firewalls, see Considerations for transit gateway-attached firewalls in the Network Firewall Developer Guide.
    ///   - vpcId: The unique identifier of the VPC where Network Firewall should create the firewall.  You can't change this setting after you create the firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func createFirewall(
        availabilityZoneChangeProtection: Bool? = nil,
        availabilityZoneMappings: [AvailabilityZoneMapping]? = nil,
        deleteProtection: Bool? = nil,
        description: String? = nil,
        enabledAnalysisTypes: [EnabledAnalysisType]? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        firewallName: String,
        firewallPolicyArn: String,
        firewallPolicyChangeProtection: Bool? = nil,
        subnetChangeProtection: Bool? = nil,
        subnetMappings: [SubnetMapping]? = nil,
        tags: [Tag]? = nil,
        transitGatewayId: String? = nil,
        vpcId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateFirewallResponse {
        let input = CreateFirewallRequest(
            availabilityZoneChangeProtection: availabilityZoneChangeProtection, 
            availabilityZoneMappings: availabilityZoneMappings, 
            deleteProtection: deleteProtection, 
            description: description, 
            enabledAnalysisTypes: enabledAnalysisTypes, 
            encryptionConfiguration: encryptionConfiguration, 
            firewallName: firewallName, 
            firewallPolicyArn: firewallPolicyArn, 
            firewallPolicyChangeProtection: firewallPolicyChangeProtection, 
            subnetChangeProtection: subnetChangeProtection, 
            subnetMappings: subnetMappings, 
            tags: tags, 
            transitGatewayId: transitGatewayId, 
            vpcId: vpcId
        )
        return try await self.createFirewall(input, logger: logger)
    }

    /// Creates the firewall policy for the firewall according to the specifications.  An Network Firewall firewall policy defines the behavior of a firewall, in a collection of stateless and stateful rule groups and other settings. You can use one firewall policy for multiple firewalls.
    @Sendable
    @inlinable
    public func createFirewallPolicy(_ input: CreateFirewallPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateFirewallPolicyResponse {
        try await self.client.execute(
            operation: "CreateFirewallPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates the firewall policy for the firewall according to the specifications.  An Network Firewall firewall policy defines the behavior of a firewall, in a collection of stateless and stateful rule groups and other settings. You can use one firewall policy for multiple firewalls.
    ///
    /// Parameters:
    ///   - description: A description of the firewall policy.
    ///   - dryRun: Indicates whether you want Network Firewall to just check the validity of the request, rather than run the request.  If set to TRUE, Network Firewall checks whether the request can run successfully, but doesn't actually make the requested changes. The call returns the value that the request would return if you ran it with dry run set to FALSE, but doesn't make additions or changes to your resources. This option allows you to make sure that you have the required permissions to run the request and that your request parameters are valid.  If set to FALSE, Network Firewall makes the requested changes to your resources.
    ///   - encryptionConfiguration: A complex type that contains settings for encryption of your firewall policy resources.
    ///   - firewallPolicy: The rule groups and policy actions to use in the firewall policy.
    ///   - firewallPolicyName: The descriptive name of the firewall policy. You can't change the name of a firewall policy after you create it.
    ///   - tags: The key:value pairs to associate with the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func createFirewallPolicy(
        description: String? = nil,
        dryRun: Bool? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        firewallPolicy: FirewallPolicy,
        firewallPolicyName: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateFirewallPolicyResponse {
        let input = CreateFirewallPolicyRequest(
            description: description, 
            dryRun: dryRun, 
            encryptionConfiguration: encryptionConfiguration, 
            firewallPolicy: firewallPolicy, 
            firewallPolicyName: firewallPolicyName, 
            tags: tags
        )
        return try await self.createFirewallPolicy(input, logger: logger)
    }

    /// Creates the specified stateless or stateful rule group, which includes the rules for network traffic inspection, a capacity setting, and tags.  You provide your rule group specification in your request using either RuleGroup or Rules.
    @Sendable
    @inlinable
    public func createRuleGroup(_ input: CreateRuleGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRuleGroupResponse {
        try await self.client.execute(
            operation: "CreateRuleGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates the specified stateless or stateful rule group, which includes the rules for network traffic inspection, a capacity setting, and tags.  You provide your rule group specification in your request using either RuleGroup or Rules.
    ///
    /// Parameters:
    ///   - analyzeRuleGroup: Indicates whether you want Network Firewall to analyze the stateless rules in the rule group for rule behavior such as asymmetric routing. If set to TRUE, Network Firewall runs the analysis and then creates the rule group for you. To run the stateless rule group analyzer without creating the rule group, set DryRun to TRUE.
    ///   - capacity: The maximum operating resources that this rule group can use. Rule group capacity is fixed at creation. When you update a rule group, you are limited to this capacity. When you reference a rule group from a firewall policy, Network Firewall reserves this capacity for the rule group.  You can retrieve the capacity that would be required for a rule group before you create the rule group by calling CreateRuleGroup with DryRun set to TRUE.   You can't change or exceed this capacity when you update the rule group, so leave room for your rule group to grow.    Capacity for a stateless rule group  For a stateless rule group, the capacity required is the sum of the capacity requirements of the individual rules that you expect to have in the rule group.  To calculate the capacity requirement of a single rule, multiply the capacity requirement values of each of the rule's match settings:   A match setting with no criteria specified has a value of 1.    A match setting with Any specified has a value of 1.    All other match settings have a value equal to the number of elements provided in the setting. For example, a protocol setting ["UDP"] and a source setting ["10.0.0.0/24"] each have a value of 1. A protocol setting ["UDP","TCP"] has a value of 2. A source setting ["10.0.0.0/24","10.0.0.1/24","10.0.0.2/24"] has a value of 3.    A rule with no criteria specified in any of its match settings has a capacity requirement of 1. A rule with protocol setting ["UDP","TCP"], source setting ["10.0.0.0/24","10.0.0.1/24","10.0.0.2/24"], and a single specification or no specification for each of the other match settings has a capacity requirement of 6.   Capacity for a stateful rule group  For a stateful rule group, the minimum capacity required is the number of individual rules that you expect to have in the rule group.
    ///   - description: A description of the rule group.
    ///   - dryRun: Indicates whether you want Network Firewall to just check the validity of the request, rather than run the request.  If set to TRUE, Network Firewall checks whether the request can run successfully, but doesn't actually make the requested changes. The call returns the value that the request would return if you ran it with dry run set to FALSE, but doesn't make additions or changes to your resources. This option allows you to make sure that you have the required permissions to run the request and that your request parameters are valid.  If set to FALSE, Network Firewall makes the requested changes to your resources.
    ///   - encryptionConfiguration: A complex type that contains settings for encryption of your rule group resources.
    ///   - ruleGroup: An object that defines the rule group rules.   You must provide either this rule group setting or a Rules setting, but not both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it.
    ///   - rules: A string containing stateful rule group rules specifications in Suricata flat format, with one rule
    ///   - sourceMetadata: A complex type that contains metadata about the rule group that your own rule group is copied from. You can use the metadata to keep track of updates made to the originating rule group.
    ///   - summaryConfiguration: An object that contains a RuleOptions array of strings.  You use RuleOptions to determine which of the following RuleSummary values are returned in response to DescribeRuleGroupSummary.    Metadata - returns    Msg     SID
    ///   - tags: The key:value pairs to associate with the resource.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains
    ///   - logger: Logger use during operation
    @inlinable
    public func createRuleGroup(
        analyzeRuleGroup: Bool? = nil,
        capacity: Int,
        description: String? = nil,
        dryRun: Bool? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        ruleGroup: RuleGroup? = nil,
        ruleGroupName: String,
        rules: String? = nil,
        sourceMetadata: SourceMetadata? = nil,
        summaryConfiguration: SummaryConfiguration? = nil,
        tags: [Tag]? = nil,
        type: RuleGroupType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRuleGroupResponse {
        let input = CreateRuleGroupRequest(
            analyzeRuleGroup: analyzeRuleGroup, 
            capacity: capacity, 
            description: description, 
            dryRun: dryRun, 
            encryptionConfiguration: encryptionConfiguration, 
            ruleGroup: ruleGroup, 
            ruleGroupName: ruleGroupName, 
            rules: rules, 
            sourceMetadata: sourceMetadata, 
            summaryConfiguration: summaryConfiguration, 
            tags: tags, 
            type: type
        )
        return try await self.createRuleGroup(input, logger: logger)
    }

    /// Creates an Network Firewall TLS inspection configuration. Network Firewall uses TLS inspection configurations to decrypt your firewall's inbound and outbound SSL/TLS traffic. After decryption, Network Firewall inspects the traffic according to your firewall policy's stateful rules, and then re-encrypts it before sending it to its destination. You can enable inspection of your firewall's inbound traffic, outbound traffic, or both. To use TLS inspection with your firewall, you must first import or provision certificates using ACM, create a TLS inspection configuration, add that configuration to a new firewall policy, and then associate that policy with your firewall. To update the settings for a TLS inspection configuration, use UpdateTLSInspectionConfiguration. To manage a TLS inspection configuration's tags, use the standard Amazon Web Services resource tagging operations, ListTagsForResource, TagResource, and UntagResource. To retrieve information about TLS inspection configurations, use ListTLSInspectionConfigurations and DescribeTLSInspectionConfiguration.  For more information about TLS inspection configurations, see Inspecting SSL/TLS traffic with TLS
    /// inspection configurations in the Network Firewall Developer Guide.
    @Sendable
    @inlinable
    public func createTLSInspectionConfiguration(_ input: CreateTLSInspectionConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateTLSInspectionConfigurationResponse {
        try await self.client.execute(
            operation: "CreateTLSInspectionConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an Network Firewall TLS inspection configuration. Network Firewall uses TLS inspection configurations to decrypt your firewall's inbound and outbound SSL/TLS traffic. After decryption, Network Firewall inspects the traffic according to your firewall policy's stateful rules, and then re-encrypts it before sending it to its destination. You can enable inspection of your firewall's inbound traffic, outbound traffic, or both. To use TLS inspection with your firewall, you must first import or provision certificates using ACM, create a TLS inspection configuration, add that configuration to a new firewall policy, and then associate that policy with your firewall. To update the settings for a TLS inspection configuration, use UpdateTLSInspectionConfiguration. To manage a TLS inspection configuration's tags, use the standard Amazon Web Services resource tagging operations, ListTagsForResource, TagResource, and UntagResource. To retrieve information about TLS inspection configurations, use ListTLSInspectionConfigurations and DescribeTLSInspectionConfiguration.  For more information about TLS inspection configurations, see Inspecting SSL/TLS traffic with TLS
    /// inspection configurations in the Network Firewall Developer Guide.
    ///
    /// Parameters:
    ///   - description: A description of the TLS inspection configuration.
    ///   - encryptionConfiguration: 
    ///   - tags: The key:value pairs to associate with the resource.
    ///   - tlsInspectionConfiguration: The object that defines a TLS inspection configuration. This, along with TLSInspectionConfigurationResponse, define the TLS inspection configuration. You can retrieve all objects for a TLS inspection configuration by calling DescribeTLSInspectionConfiguration.  Network Firewall uses a TLS inspection configuration to decrypt traffic. Network Firewall re-encrypts the traffic before sending it to its destination. To use a TLS inspection configuration, you add it to a new Network Firewall firewall policy, then you apply the firewall policy to a firewall. Network Firewall acts as a proxy service to decrypt and inspect the traffic traveling through your firewalls. You can reference a TLS inspection configuration from more than one firewall policy, and you can use a firewall policy in more than one firewall. For more information about using TLS inspection configurations, see  Inspecting SSL/TLS traffic with TLS
    ///   - tlsInspectionConfigurationName: The descriptive name of the TLS inspection configuration. You can't change the name of a TLS inspection configuration after you create it.
    ///   - logger: Logger use during operation
    @inlinable
    public func createTLSInspectionConfiguration(
        description: String? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        tags: [Tag]? = nil,
        tlsInspectionConfiguration: TLSInspectionConfiguration,
        tlsInspectionConfigurationName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateTLSInspectionConfigurationResponse {
        let input = CreateTLSInspectionConfigurationRequest(
            description: description, 
            encryptionConfiguration: encryptionConfiguration, 
            tags: tags, 
            tlsInspectionConfiguration: tlsInspectionConfiguration, 
            tlsInspectionConfigurationName: tlsInspectionConfigurationName
        )
        return try await self.createTLSInspectionConfiguration(input, logger: logger)
    }

    /// Creates a firewall endpoint for an Network Firewall firewall. This type of firewall endpoint is independent of the firewall endpoints that you specify in the Firewall itself, and you define it in addition to those endpoints after the firewall has been created. You can define a VPC endpoint association using a different VPC than the one you used in the firewall specifications.
    @Sendable
    @inlinable
    public func createVpcEndpointAssociation(_ input: CreateVpcEndpointAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateVpcEndpointAssociationResponse {
        try await self.client.execute(
            operation: "CreateVpcEndpointAssociation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a firewall endpoint for an Network Firewall firewall. This type of firewall endpoint is independent of the firewall endpoints that you specify in the Firewall itself, and you define it in addition to those endpoints after the firewall has been created. You can define a VPC endpoint association using a different VPC than the one you used in the firewall specifications.
    ///
    /// Parameters:
    ///   - description: A description of the VPC endpoint association.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - subnetMapping: 
    ///   - tags: The key:value pairs to associate with the resource.
    ///   - vpcId: The unique identifier of the VPC where you want to create a firewall endpoint.
    ///   - logger: Logger use during operation
    @inlinable
    public func createVpcEndpointAssociation(
        description: String? = nil,
        firewallArn: String,
        subnetMapping: SubnetMapping,
        tags: [Tag]? = nil,
        vpcId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateVpcEndpointAssociationResponse {
        let input = CreateVpcEndpointAssociationRequest(
            description: description, 
            firewallArn: firewallArn, 
            subnetMapping: subnetMapping, 
            tags: tags, 
            vpcId: vpcId
        )
        return try await self.createVpcEndpointAssociation(input, logger: logger)
    }

    /// Deletes the specified Firewall and its FirewallStatus. This operation requires the firewall's DeleteProtection flag to be FALSE. You can't revert this operation.  You can check whether a firewall is in use by reviewing the route tables for the Availability Zones where you have firewall subnet mappings. Retrieve the subnet mappings by calling DescribeFirewall. You define and update the route tables through Amazon VPC. As needed, update the route tables for the zones to remove the firewall endpoints. When the route tables no longer use the firewall endpoints, you can remove the firewall safely. To delete a firewall, remove the delete protection if you need to using UpdateFirewallDeleteProtection, then delete the firewall by calling DeleteFirewall.
    @Sendable
    @inlinable
    public func deleteFirewall(_ input: DeleteFirewallRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteFirewallResponse {
        try await self.client.execute(
            operation: "DeleteFirewall", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified Firewall and its FirewallStatus. This operation requires the firewall's DeleteProtection flag to be FALSE. You can't revert this operation.  You can check whether a firewall is in use by reviewing the route tables for the Availability Zones where you have firewall subnet mappings. Retrieve the subnet mappings by calling DescribeFirewall. You define and update the route tables through Amazon VPC. As needed, update the route tables for the zones to remove the firewall endpoints. When the route tables no longer use the firewall endpoints, you can remove the firewall safely. To delete a firewall, remove the delete protection if you need to using UpdateFirewallDeleteProtection, then delete the firewall by calling DeleteFirewall.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteFirewall(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteFirewallResponse {
        let input = DeleteFirewallRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName
        )
        return try await self.deleteFirewall(input, logger: logger)
    }

    /// Deletes the specified FirewallPolicy.
    @Sendable
    @inlinable
    public func deleteFirewallPolicy(_ input: DeleteFirewallPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteFirewallPolicyResponse {
        try await self.client.execute(
            operation: "DeleteFirewallPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified FirewallPolicy.
    ///
    /// Parameters:
    ///   - firewallPolicyArn: The Amazon Resource Name (ARN) of the firewall policy. You must specify the ARN or the name, and you can specify both.
    ///   - firewallPolicyName: The descriptive name of the firewall policy. You can't change the name of a firewall policy after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteFirewallPolicy(
        firewallPolicyArn: String? = nil,
        firewallPolicyName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteFirewallPolicyResponse {
        let input = DeleteFirewallPolicyRequest(
            firewallPolicyArn: firewallPolicyArn, 
            firewallPolicyName: firewallPolicyName
        )
        return try await self.deleteFirewallPolicy(input, logger: logger)
    }

    /// Deletes a transit gateway attachment from a Network Firewall. Either the firewall owner or the transit gateway owner can delete the attachment.  After you delete a transit gateway attachment, raffic will no longer flow through the firewall endpoints.  After you initiate the delete operation, use DescribeFirewall to monitor the deletion status.
    @Sendable
    @inlinable
    public func deleteNetworkFirewallTransitGatewayAttachment(_ input: DeleteNetworkFirewallTransitGatewayAttachmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteNetworkFirewallTransitGatewayAttachmentResponse {
        try await self.client.execute(
            operation: "DeleteNetworkFirewallTransitGatewayAttachment", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a transit gateway attachment from a Network Firewall. Either the firewall owner or the transit gateway owner can delete the attachment.  After you delete a transit gateway attachment, raffic will no longer flow through the firewall endpoints.  After you initiate the delete operation, use DescribeFirewall to monitor the deletion status.
    ///
    /// Parameters:
    ///   - transitGatewayAttachmentId: Required. The unique identifier of the transit gateway attachment to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteNetworkFirewallTransitGatewayAttachment(
        transitGatewayAttachmentId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteNetworkFirewallTransitGatewayAttachmentResponse {
        let input = DeleteNetworkFirewallTransitGatewayAttachmentRequest(
            transitGatewayAttachmentId: transitGatewayAttachmentId
        )
        return try await self.deleteNetworkFirewallTransitGatewayAttachment(input, logger: logger)
    }

    /// Deletes a resource policy that you created in a PutResourcePolicy request.
    @Sendable
    @inlinable
    public func deleteResourcePolicy(_ input: DeleteResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteResourcePolicyResponse {
        try await self.client.execute(
            operation: "DeleteResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a resource policy that you created in a PutResourcePolicy request.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the rule group or firewall policy whose resource policy you want to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteResourcePolicy(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteResourcePolicyResponse {
        let input = DeleteResourcePolicyRequest(
            resourceArn: resourceArn
        )
        return try await self.deleteResourcePolicy(input, logger: logger)
    }

    /// Deletes the specified RuleGroup.
    @Sendable
    @inlinable
    public func deleteRuleGroup(_ input: DeleteRuleGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRuleGroupResponse {
        try await self.client.execute(
            operation: "DeleteRuleGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified RuleGroup.
    ///
    /// Parameters:
    ///   - ruleGroupArn: The Amazon Resource Name (ARN) of the rule group. You must specify the ARN or the name, and you can specify both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRuleGroup(
        ruleGroupArn: String? = nil,
        ruleGroupName: String? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRuleGroupResponse {
        let input = DeleteRuleGroupRequest(
            ruleGroupArn: ruleGroupArn, 
            ruleGroupName: ruleGroupName, 
            type: type
        )
        return try await self.deleteRuleGroup(input, logger: logger)
    }

    /// Deletes the specified TLSInspectionConfiguration.
    @Sendable
    @inlinable
    public func deleteTLSInspectionConfiguration(_ input: DeleteTLSInspectionConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteTLSInspectionConfigurationResponse {
        try await self.client.execute(
            operation: "DeleteTLSInspectionConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified TLSInspectionConfiguration.
    ///
    /// Parameters:
    ///   - tlsInspectionConfigurationArn: The Amazon Resource Name (ARN) of the TLS inspection configuration. You must specify the ARN or the name, and you can specify both.
    ///   - tlsInspectionConfigurationName: The descriptive name of the TLS inspection configuration. You can't change the name of a TLS inspection configuration after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteTLSInspectionConfiguration(
        tlsInspectionConfigurationArn: String? = nil,
        tlsInspectionConfigurationName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteTLSInspectionConfigurationResponse {
        let input = DeleteTLSInspectionConfigurationRequest(
            tlsInspectionConfigurationArn: tlsInspectionConfigurationArn, 
            tlsInspectionConfigurationName: tlsInspectionConfigurationName
        )
        return try await self.deleteTLSInspectionConfiguration(input, logger: logger)
    }

    /// Deletes the specified VpcEndpointAssociation. You can check whether an endpoint association is in use by reviewing the route tables for the Availability Zones where you have the endpoint subnet mapping.  You can retrieve the subnet mapping by calling DescribeVpcEndpointAssociation. You define and update the route tables through Amazon VPC. As needed, update the route tables for the Availability Zone to remove the firewall endpoint for the association. When the route tables no longer use the firewall endpoint, you can remove the endpoint association safely.
    @Sendable
    @inlinable
    public func deleteVpcEndpointAssociation(_ input: DeleteVpcEndpointAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteVpcEndpointAssociationResponse {
        try await self.client.execute(
            operation: "DeleteVpcEndpointAssociation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified VpcEndpointAssociation. You can check whether an endpoint association is in use by reviewing the route tables for the Availability Zones where you have the endpoint subnet mapping.  You can retrieve the subnet mapping by calling DescribeVpcEndpointAssociation. You define and update the route tables through Amazon VPC. As needed, update the route tables for the Availability Zone to remove the firewall endpoint for the association. When the route tables no longer use the firewall endpoint, you can remove the endpoint association safely.
    ///
    /// Parameters:
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteVpcEndpointAssociation(
        vpcEndpointAssociationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteVpcEndpointAssociationResponse {
        let input = DeleteVpcEndpointAssociationRequest(
            vpcEndpointAssociationArn: vpcEndpointAssociationArn
        )
        return try await self.deleteVpcEndpointAssociation(input, logger: logger)
    }

    /// Returns the data objects for the specified firewall.
    @Sendable
    @inlinable
    public func describeFirewall(_ input: DescribeFirewallRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFirewallResponse {
        try await self.client.execute(
            operation: "DescribeFirewall", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data objects for the specified firewall.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFirewall(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFirewallResponse {
        let input = DescribeFirewallRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName
        )
        return try await self.describeFirewall(input, logger: logger)
    }

    /// Returns the high-level information about a firewall, including the Availability Zones where the Firewall is  currently in use.
    @Sendable
    @inlinable
    public func describeFirewallMetadata(_ input: DescribeFirewallMetadataRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFirewallMetadataResponse {
        try await self.client.execute(
            operation: "DescribeFirewallMetadata", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the high-level information about a firewall, including the Availability Zones where the Firewall is  currently in use.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFirewallMetadata(
        firewallArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFirewallMetadataResponse {
        let input = DescribeFirewallMetadataRequest(
            firewallArn: firewallArn
        )
        return try await self.describeFirewallMetadata(input, logger: logger)
    }

    /// Returns the data objects for the specified firewall policy.
    @Sendable
    @inlinable
    public func describeFirewallPolicy(_ input: DescribeFirewallPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFirewallPolicyResponse {
        try await self.client.execute(
            operation: "DescribeFirewallPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data objects for the specified firewall policy.
    ///
    /// Parameters:
    ///   - firewallPolicyArn: The Amazon Resource Name (ARN) of the firewall policy. You must specify the ARN or the name, and you can specify both.
    ///   - firewallPolicyName: The descriptive name of the firewall policy. You can't change the name of a firewall policy after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFirewallPolicy(
        firewallPolicyArn: String? = nil,
        firewallPolicyName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFirewallPolicyResponse {
        let input = DescribeFirewallPolicyRequest(
            firewallPolicyArn: firewallPolicyArn, 
            firewallPolicyName: firewallPolicyName
        )
        return try await self.describeFirewallPolicy(input, logger: logger)
    }

    /// Returns key information about a specific flow operation.
    @Sendable
    @inlinable
    public func describeFlowOperation(_ input: DescribeFlowOperationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFlowOperationResponse {
        try await self.client.execute(
            operation: "DescribeFlowOperation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns key information about a specific flow operation.
    ///
    /// Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowOperationId: A unique identifier for the flow operation. This ID is returned in the responses to start and list commands. You provide to describe commands.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFlowOperation(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowOperationId: String,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFlowOperationResponse {
        let input = DescribeFlowOperationRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowOperationId: flowOperationId, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.describeFlowOperation(input, logger: logger)
    }

    /// Returns the logging configuration for the specified firewall.
    @Sendable
    @inlinable
    public func describeLoggingConfiguration(_ input: DescribeLoggingConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeLoggingConfigurationResponse {
        try await self.client.execute(
            operation: "DescribeLoggingConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the logging configuration for the specified firewall.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeLoggingConfiguration(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeLoggingConfigurationResponse {
        let input = DescribeLoggingConfigurationRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName
        )
        return try await self.describeLoggingConfiguration(input, logger: logger)
    }

    /// Retrieves a resource policy that you created in a PutResourcePolicy request.
    @Sendable
    @inlinable
    public func describeResourcePolicy(_ input: DescribeResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeResourcePolicyResponse {
        try await self.client.execute(
            operation: "DescribeResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a resource policy that you created in a PutResourcePolicy request.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the rule group or firewall policy whose resource policy you want to retrieve.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeResourcePolicy(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeResourcePolicyResponse {
        let input = DescribeResourcePolicyRequest(
            resourceArn: resourceArn
        )
        return try await self.describeResourcePolicy(input, logger: logger)
    }

    /// Returns the data objects for the specified rule group.
    @Sendable
    @inlinable
    public func describeRuleGroup(_ input: DescribeRuleGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRuleGroupResponse {
        try await self.client.execute(
            operation: "DescribeRuleGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data objects for the specified rule group.
    ///
    /// Parameters:
    ///   - analyzeRuleGroup: Indicates whether you want Network Firewall to analyze the stateless rules in the rule group for rule behavior such as asymmetric routing. If set to TRUE, Network Firewall runs the analysis.
    ///   - ruleGroupArn: The Amazon Resource Name (ARN) of the rule group. You must specify the ARN or the name, and you can specify both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRuleGroup(
        analyzeRuleGroup: Bool? = nil,
        ruleGroupArn: String? = nil,
        ruleGroupName: String? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRuleGroupResponse {
        let input = DescribeRuleGroupRequest(
            analyzeRuleGroup: analyzeRuleGroup, 
            ruleGroupArn: ruleGroupArn, 
            ruleGroupName: ruleGroupName, 
            type: type
        )
        return try await self.describeRuleGroup(input, logger: logger)
    }

    /// High-level information about a rule group, returned by operations like create and describe. You can use the information provided in the metadata to retrieve and manage a rule group. You can retrieve all objects for a rule group by calling DescribeRuleGroup.
    @Sendable
    @inlinable
    public func describeRuleGroupMetadata(_ input: DescribeRuleGroupMetadataRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRuleGroupMetadataResponse {
        try await self.client.execute(
            operation: "DescribeRuleGroupMetadata", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// High-level information about a rule group, returned by operations like create and describe. You can use the information provided in the metadata to retrieve and manage a rule group. You can retrieve all objects for a rule group by calling DescribeRuleGroup.
    ///
    /// Parameters:
    ///   - ruleGroupArn: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRuleGroupMetadata(
        ruleGroupArn: String? = nil,
        ruleGroupName: String? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRuleGroupMetadataResponse {
        let input = DescribeRuleGroupMetadataRequest(
            ruleGroupArn: ruleGroupArn, 
            ruleGroupName: ruleGroupName, 
            type: type
        )
        return try await self.describeRuleGroupMetadata(input, logger: logger)
    }

    /// Returns detailed information for a stateful rule group. For active threat defense Amazon Web Services managed rule groups, this operation provides insight into the protections enabled by the rule group, based on Suricata rule metadata fields. Summaries are available for rule groups you manage and for active threat defense Amazon Web Services managed rule groups. To modify how threat information appears in summaries, use the SummaryConfiguration parameter in UpdateRuleGroup.
    @Sendable
    @inlinable
    public func describeRuleGroupSummary(_ input: DescribeRuleGroupSummaryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRuleGroupSummaryResponse {
        try await self.client.execute(
            operation: "DescribeRuleGroupSummary", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns detailed information for a stateful rule group. For active threat defense Amazon Web Services managed rule groups, this operation provides insight into the protections enabled by the rule group, based on Suricata rule metadata fields. Summaries are available for rule groups you manage and for active threat defense Amazon Web Services managed rule groups. To modify how threat information appears in summaries, use the SummaryConfiguration parameter in UpdateRuleGroup.
    ///
    /// Parameters:
    ///   - ruleGroupArn: Required. The Amazon Resource Name (ARN) of the rule group. You must specify the ARN or the name, and you can specify both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - type: The type of rule group you want a summary for. This is a required field. Valid value: STATEFUL  Note that STATELESS exists but is not currently supported. If you provide STATELESS, an exception is returned.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRuleGroupSummary(
        ruleGroupArn: String? = nil,
        ruleGroupName: String? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRuleGroupSummaryResponse {
        let input = DescribeRuleGroupSummaryRequest(
            ruleGroupArn: ruleGroupArn, 
            ruleGroupName: ruleGroupName, 
            type: type
        )
        return try await self.describeRuleGroupSummary(input, logger: logger)
    }

    /// Returns the data objects for the specified TLS inspection configuration.
    @Sendable
    @inlinable
    public func describeTLSInspectionConfiguration(_ input: DescribeTLSInspectionConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeTLSInspectionConfigurationResponse {
        try await self.client.execute(
            operation: "DescribeTLSInspectionConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data objects for the specified TLS inspection configuration.
    ///
    /// Parameters:
    ///   - tlsInspectionConfigurationArn: The Amazon Resource Name (ARN) of the TLS inspection configuration. You must specify the ARN or the name, and you can specify both.
    ///   - tlsInspectionConfigurationName: The descriptive name of the TLS inspection configuration. You can't change the name of a TLS inspection configuration after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeTLSInspectionConfiguration(
        tlsInspectionConfigurationArn: String? = nil,
        tlsInspectionConfigurationName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeTLSInspectionConfigurationResponse {
        let input = DescribeTLSInspectionConfigurationRequest(
            tlsInspectionConfigurationArn: tlsInspectionConfigurationArn, 
            tlsInspectionConfigurationName: tlsInspectionConfigurationName
        )
        return try await self.describeTLSInspectionConfiguration(input, logger: logger)
    }

    /// Returns the data object for the specified VPC endpoint association.
    @Sendable
    @inlinable
    public func describeVpcEndpointAssociation(_ input: DescribeVpcEndpointAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeVpcEndpointAssociationResponse {
        try await self.client.execute(
            operation: "DescribeVpcEndpointAssociation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data object for the specified VPC endpoint association.
    ///
    /// Parameters:
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeVpcEndpointAssociation(
        vpcEndpointAssociationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeVpcEndpointAssociationResponse {
        let input = DescribeVpcEndpointAssociationRequest(
            vpcEndpointAssociationArn: vpcEndpointAssociationArn
        )
        return try await self.describeVpcEndpointAssociation(input, logger: logger)
    }

    /// Removes the specified Availability Zone associations from a transit gateway-attached firewall. This removes the firewall endpoints from these Availability Zones and stops traffic filtering in those zones. Before removing an Availability Zone, ensure you've updated your transit gateway route tables to redirect traffic appropriately.  If AvailabilityZoneChangeProtection is enabled, you must first disable it using UpdateAvailabilityZoneChangeProtection.  To verify the status of your Availability Zone changes, use DescribeFirewall.
    @Sendable
    @inlinable
    public func disassociateAvailabilityZones(_ input: DisassociateAvailabilityZonesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateAvailabilityZonesResponse {
        try await self.client.execute(
            operation: "DisassociateAvailabilityZones", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the specified Availability Zone associations from a transit gateway-attached firewall. This removes the firewall endpoints from these Availability Zones and stops traffic filtering in those zones. Before removing an Availability Zone, ensure you've updated your transit gateway route tables to redirect traffic appropriately.  If AvailabilityZoneChangeProtection is enabled, you must first disable it using UpdateAvailabilityZoneChangeProtection.  To verify the status of your Availability Zone changes, use DescribeFirewall.
    ///
    /// Parameters:
    ///   - availabilityZoneMappings: Required. The Availability Zones to remove from the firewall's configuration.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateAvailabilityZones(
        availabilityZoneMappings: [AvailabilityZoneMapping],
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateAvailabilityZonesResponse {
        let input = DisassociateAvailabilityZonesRequest(
            availabilityZoneMappings: availabilityZoneMappings, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.disassociateAvailabilityZones(input, logger: logger)
    }

    /// Removes the specified subnet associations from the firewall. This removes the firewall endpoints from the subnets and removes any network filtering protections that the endpoints were providing.
    @Sendable
    @inlinable
    public func disassociateSubnets(_ input: DisassociateSubnetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateSubnetsResponse {
        try await self.client.execute(
            operation: "DisassociateSubnets", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the specified subnet associations from the firewall. This removes the firewall endpoints from the subnets and removes any network filtering protections that the endpoints were providing.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - subnetIds: The unique identifiers for the subnets that you want to disassociate.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateSubnets(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        subnetIds: [String],
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateSubnetsResponse {
        let input = DisassociateSubnetsRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            subnetIds: subnetIds, 
            updateToken: updateToken
        )
        return try await self.disassociateSubnets(input, logger: logger)
    }

    /// The results of a COMPLETED analysis report generated with StartAnalysisReport. For more information, see AnalysisTypeReportResult.
    @Sendable
    @inlinable
    public func getAnalysisReportResults(_ input: GetAnalysisReportResultsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAnalysisReportResultsResponse {
        try await self.client.execute(
            operation: "GetAnalysisReportResults", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// The results of a COMPLETED analysis report generated with StartAnalysisReport. For more information, see AnalysisTypeReportResult.
    ///
    /// Parameters:
    ///   - analysisReportId: The unique ID of the query that ran when you requested an analysis report.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAnalysisReportResults(
        analysisReportId: String,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAnalysisReportResultsResponse {
        let input = GetAnalysisReportResultsRequest(
            analysisReportId: analysisReportId, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.getAnalysisReportResults(input, logger: logger)
    }

    /// Returns a list of all traffic analysis reports generated within the last 30 days.
    @Sendable
    @inlinable
    public func listAnalysisReports(_ input: ListAnalysisReportsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAnalysisReportsResponse {
        try await self.client.execute(
            operation: "ListAnalysisReports", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of all traffic analysis reports generated within the last 30 days.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAnalysisReports(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAnalysisReportsResponse {
        let input = ListAnalysisReportsRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listAnalysisReports(input, logger: logger)
    }

    /// Retrieves the metadata for the firewall policies that you have defined. Depending on your setting for max results and the number of firewall policies, a single call might not return the full list.
    @Sendable
    @inlinable
    public func listFirewallPolicies(_ input: ListFirewallPoliciesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFirewallPoliciesResponse {
        try await self.client.execute(
            operation: "ListFirewallPolicies", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the metadata for the firewall policies that you have defined. Depending on your setting for max results and the number of firewall policies, a single call might not return the full list.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFirewallPolicies(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFirewallPoliciesResponse {
        let input = ListFirewallPoliciesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listFirewallPolicies(input, logger: logger)
    }

    /// Retrieves the metadata for the firewalls that you have defined. If you provide VPC identifiers in your request, this returns only the firewalls for those VPCs. Depending on your setting for max results and the number of firewalls, a single call might not return the full list.
    @Sendable
    @inlinable
    public func listFirewalls(_ input: ListFirewallsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFirewallsResponse {
        try await self.client.execute(
            operation: "ListFirewalls", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the metadata for the firewalls that you have defined. If you provide VPC identifiers in your request, this returns only the firewalls for those VPCs. Depending on your setting for max results and the number of firewalls, a single call might not return the full list.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - vpcIds: The unique identifiers of the VPCs that you want Network Firewall to retrieve the firewalls for. Leave this blank to retrieve all firewalls that you have defined.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFirewalls(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        vpcIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFirewallsResponse {
        let input = ListFirewallsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            vpcIds: vpcIds
        )
        return try await self.listFirewalls(input, logger: logger)
    }

    /// Returns the results of a specific flow operation.  Flow operations let you manage the flows tracked in the flow table, also known as the firewall table. A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.
    @Sendable
    @inlinable
    public func listFlowOperationResults(_ input: ListFlowOperationResultsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFlowOperationResultsResponse {
        try await self.client.execute(
            operation: "ListFlowOperationResults", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the results of a specific flow operation.  Flow operations let you manage the flows tracked in the flow table, also known as the firewall table. A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.
    ///
    /// Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowOperationId: A unique identifier for the flow operation. This ID is returned in the responses to start and list commands. You provide to describe commands.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFlowOperationResults(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowOperationId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFlowOperationResultsResponse {
        let input = ListFlowOperationResultsRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowOperationId: flowOperationId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.listFlowOperationResults(input, logger: logger)
    }

    /// Returns a list of all flow operations ran in a specific firewall.  You can optionally narrow the request scope by specifying the operation type or Availability Zone associated with a firewall's flow operations.   Flow operations let you manage the flows tracked in the flow table, also known as the firewall table. A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.
    @Sendable
    @inlinable
    public func listFlowOperations(_ input: ListFlowOperationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFlowOperationsResponse {
        try await self.client.execute(
            operation: "ListFlowOperations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of all flow operations ran in a specific firewall.  You can optionally narrow the request scope by specifying the operation type or Availability Zone associated with a firewall's flow operations.   Flow operations let you manage the flows tracked in the flow table, also known as the firewall table. A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.
    ///
    /// Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowOperationType: An optional string that defines whether any or all operation types are returned.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFlowOperations(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowOperationType: FlowOperationType? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFlowOperationsResponse {
        let input = ListFlowOperationsRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowOperationType: flowOperationType, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.listFlowOperations(input, logger: logger)
    }

    /// Retrieves the metadata for the rule groups that you have defined. Depending on your setting for max results and the number of rule groups, a single call might not return the full list.
    @Sendable
    @inlinable
    public func listRuleGroups(_ input: ListRuleGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRuleGroupsResponse {
        try await self.client.execute(
            operation: "ListRuleGroups", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the metadata for the rule groups that you have defined. Depending on your setting for max results and the number of rule groups, a single call might not return the full list.
    ///
    /// Parameters:
    ///   - managedType: Indicates the general category of the Amazon Web Services managed rule group.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - scope: The scope of the request. The default setting of ACCOUNT or a setting of NULL returns all of the rule groups in your account. A setting of MANAGED returns all available managed rule groups.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains stateless rules. If it is stateful, it contains stateful rules.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRuleGroups(
        managedType: ResourceManagedType? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        scope: ResourceManagedStatus? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRuleGroupsResponse {
        let input = ListRuleGroupsRequest(
            managedType: managedType, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            scope: scope, 
            type: type
        )
        return try await self.listRuleGroups(input, logger: logger)
    }

    /// Retrieves the metadata for the TLS inspection configurations that you have defined. Depending on your setting for max results and the number of TLS inspection configurations, a single call might not return the full list.
    @Sendable
    @inlinable
    public func listTLSInspectionConfigurations(_ input: ListTLSInspectionConfigurationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTLSInspectionConfigurationsResponse {
        try await self.client.execute(
            operation: "ListTLSInspectionConfigurations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the metadata for the TLS inspection configurations that you have defined. Depending on your setting for max results and the number of TLS inspection configurations, a single call might not return the full list.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTLSInspectionConfigurations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTLSInspectionConfigurationsResponse {
        let input = ListTLSInspectionConfigurationsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listTLSInspectionConfigurations(input, logger: logger)
    }

    /// Retrieves the tags associated with the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can tag the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the tags associated with the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can tag the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Retrieves the metadata for the VPC endpoint associations that you have defined. If you specify a fireawll, this returns only the endpoint associations for that firewall.  Depending on your setting for max results and the number of associations, a single call might not return the full list.
    @Sendable
    @inlinable
    public func listVpcEndpointAssociations(_ input: ListVpcEndpointAssociationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListVpcEndpointAssociationsResponse {
        try await self.client.execute(
            operation: "ListVpcEndpointAssociations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the metadata for the VPC endpoint associations that you have defined. If you specify a fireawll, this returns only the endpoint associations for that firewall.  Depending on your setting for max results and the number of associations, a single call might not return the full list.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. If you don't specify this, Network Firewall retrieves all VPC endpoint associations that you have defined.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - nextToken: When you request a list of objects with a MaxResults setting, if the number of objects that are still available for retrieval exceeds the maximum you requested, Network Firewall returns a NextToken value in the response. To retrieve the next batch of objects, use the token returned from the prior request in your next request.
    ///   - logger: Logger use during operation
    @inlinable
    public func listVpcEndpointAssociations(
        firewallArn: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListVpcEndpointAssociationsResponse {
        let input = ListVpcEndpointAssociationsRequest(
            firewallArn: firewallArn, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listVpcEndpointAssociations(input, logger: logger)
    }

    /// Creates or updates an IAM policy for your rule group, firewall policy, or firewall. Use this to share these resources between accounts. This operation works in conjunction with the Amazon Web Services Resource Access Manager (RAM) service to manage resource sharing for Network Firewall.  For information about using sharing with Network Firewall resources, see  Sharing Network Firewall resources in the Network Firewall Developer Guide. Use this operation to create or update a resource policy for your Network Firewall rule group, firewall policy, or firewall. In the resource policy, you specify the accounts that you want to share the Network Firewall resource with and the operations that you want the accounts to be able to perform.  When you add an account in the resource policy, you then run the following Resource Access Manager (RAM) operations to access and accept the shared resource.     GetResourceShareInvitations - Returns the Amazon Resource Names (ARNs) of the resource share invitations.      AcceptResourceShareInvitation - Accepts the share invitation for a specified resource share.    For additional information about resource sharing using RAM, see Resource Access Manager User Guide.
    @Sendable
    @inlinable
    public func putResourcePolicy(_ input: PutResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutResourcePolicyResponse {
        try await self.client.execute(
            operation: "PutResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates or updates an IAM policy for your rule group, firewall policy, or firewall. Use this to share these resources between accounts. This operation works in conjunction with the Amazon Web Services Resource Access Manager (RAM) service to manage resource sharing for Network Firewall.  For information about using sharing with Network Firewall resources, see  Sharing Network Firewall resources in the Network Firewall Developer Guide. Use this operation to create or update a resource policy for your Network Firewall rule group, firewall policy, or firewall. In the resource policy, you specify the accounts that you want to share the Network Firewall resource with and the operations that you want the accounts to be able to perform.  When you add an account in the resource policy, you then run the following Resource Access Manager (RAM) operations to access and accept the shared resource.     GetResourceShareInvitations - Returns the Amazon Resource Names (ARNs) of the resource share invitations.      AcceptResourceShareInvitation - Accepts the share invitation for a specified resource share.    For additional information about resource sharing using RAM, see Resource Access Manager User Guide.
    ///
    /// Parameters:
    ///   - policy: The IAM policy statement that lists the accounts that you want to share your Network Firewall resources with and the operations that you want the accounts to be able to perform.  For a rule group resource, you can specify the following operations in the Actions section of the statement:   network-firewall:CreateFirewallPolicy   network-firewall:UpdateFirewallPolicy   network-firewall:ListRuleGroups   For a firewall policy resource, you can specify the following operations in the Actions section of the statement:   network-firewall:AssociateFirewallPolicy   network-firewall:ListFirewallPolicies   For a firewall resource, you can specify the following operations in the Actions section of the statement:   network-firewall:CreateVpcEndpointAssociation   network-firewall:DescribeFirewallMetadata   network-firewall:ListFirewalls   In the Resource section of the statement, you specify the ARNs for the Network Firewall resources that you want to share with the account that you specified in Arn.
    ///   - resourceArn: The Amazon Resource Name (ARN) of the account that you want to share your Network Firewall resources with.
    ///   - logger: Logger use during operation
    @inlinable
    public func putResourcePolicy(
        policy: String,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutResourcePolicyResponse {
        let input = PutResourcePolicyRequest(
            policy: policy, 
            resourceArn: resourceArn
        )
        return try await self.putResourcePolicy(input, logger: logger)
    }

    /// Rejects a transit gateway attachment request for Network Firewall. When you reject the attachment request, Network Firewall cancels the creation of routing components between the transit gateway and firewall endpoints. Only the firewall owner can reject the attachment. After rejection, no traffic will flow through the firewall endpoints for this attachment. Use DescribeFirewall to monitor the rejection status. To accept the attachment instead of rejecting it, use AcceptNetworkFirewallTransitGatewayAttachment.  Once rejected, you cannot reverse this action. To establish connectivity, you must create a new transit gateway-attached firewall.
    @Sendable
    @inlinable
    public func rejectNetworkFirewallTransitGatewayAttachment(_ input: RejectNetworkFirewallTransitGatewayAttachmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RejectNetworkFirewallTransitGatewayAttachmentResponse {
        try await self.client.execute(
            operation: "RejectNetworkFirewallTransitGatewayAttachment", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Rejects a transit gateway attachment request for Network Firewall. When you reject the attachment request, Network Firewall cancels the creation of routing components between the transit gateway and firewall endpoints. Only the firewall owner can reject the attachment. After rejection, no traffic will flow through the firewall endpoints for this attachment. Use DescribeFirewall to monitor the rejection status. To accept the attachment instead of rejecting it, use AcceptNetworkFirewallTransitGatewayAttachment.  Once rejected, you cannot reverse this action. To establish connectivity, you must create a new transit gateway-attached firewall.
    ///
    /// Parameters:
    ///   - transitGatewayAttachmentId: Required. The unique identifier of the transit gateway attachment to reject. This ID is returned in the response when creating a transit gateway-attached firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func rejectNetworkFirewallTransitGatewayAttachment(
        transitGatewayAttachmentId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RejectNetworkFirewallTransitGatewayAttachmentResponse {
        let input = RejectNetworkFirewallTransitGatewayAttachmentRequest(
            transitGatewayAttachmentId: transitGatewayAttachmentId
        )
        return try await self.rejectNetworkFirewallTransitGatewayAttachment(input, logger: logger)
    }

    /// Generates a traffic analysis report for the timeframe and traffic type you specify. For information on the contents of a traffic analysis report, see AnalysisReport.
    @Sendable
    @inlinable
    public func startAnalysisReport(_ input: StartAnalysisReportRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartAnalysisReportResponse {
        try await self.client.execute(
            operation: "StartAnalysisReport", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Generates a traffic analysis report for the timeframe and traffic type you specify. For information on the contents of a traffic analysis report, see AnalysisReport.
    ///
    /// Parameters:
    ///   - analysisType: The type of traffic that will be used to generate a report.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - logger: Logger use during operation
    @inlinable
    public func startAnalysisReport(
        analysisType: EnabledAnalysisType,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartAnalysisReportResponse {
        let input = StartAnalysisReportRequest(
            analysisType: analysisType, 
            firewallArn: firewallArn, 
            firewallName: firewallName
        )
        return try await self.startAnalysisReport(input, logger: logger)
    }

    /// Begins capturing the flows in a firewall, according to the filters you define.  Captures are similar, but not identical to snapshots. Capture operations provide visibility into flows that are not closed and are tracked by a firewall's flow table.  Unlike snapshots, captures are a time-boxed view.  A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.   To avoid encountering operation limits, you should avoid starting captures with broad filters, like wide IP ranges.  Instead, we recommend you define more specific criteria with FlowFilters, like narrow IP ranges, ports, or protocols.
    @Sendable
    @inlinable
    public func startFlowCapture(_ input: StartFlowCaptureRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartFlowCaptureResponse {
        try await self.client.execute(
            operation: "StartFlowCapture", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Begins capturing the flows in a firewall, according to the filters you define.  Captures are similar, but not identical to snapshots. Capture operations provide visibility into flows that are not closed and are tracked by a firewall's flow table.  Unlike snapshots, captures are a time-boxed view.  A flow is network traffic that is monitored by a firewall, either by stateful or stateless rules.
    /// For traffic to be considered part of a flow, it must share Destination, DestinationPort, Direction, Protocol, Source, and SourcePort.   To avoid encountering operation limits, you should avoid starting captures with broad filters, like wide IP ranges.  Instead, we recommend you define more specific criteria with FlowFilters, like narrow IP ranges, ports, or protocols.
    ///
    /// Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowFilters: Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - minimumFlowAgeInSeconds: The reqested FlowOperation ignores flows with an age (in seconds) lower than MinimumFlowAgeInSeconds.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func startFlowCapture(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowFilters: [FlowFilter],
        minimumFlowAgeInSeconds: Int? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartFlowCaptureResponse {
        let input = StartFlowCaptureRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowFilters: flowFilters, 
            minimumFlowAgeInSeconds: minimumFlowAgeInSeconds, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.startFlowCapture(input, logger: logger)
    }

    /// Begins the flushing of traffic from the firewall, according to the filters you define.  When the operation starts, impacted flows are temporarily marked as timed out before the Suricata engine prunes,  or flushes, the flows from the firewall table.  While the flush completes, impacted flows are processed as midstream traffic. This may result in a  temporary increase in midstream traffic metrics. We recommend that you double check your stream exception policy  before you perform a flush operation.
    @Sendable
    @inlinable
    public func startFlowFlush(_ input: StartFlowFlushRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartFlowFlushResponse {
        try await self.client.execute(
            operation: "StartFlowFlush", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Begins the flushing of traffic from the firewall, according to the filters you define.  When the operation starts, impacted flows are temporarily marked as timed out before the Suricata engine prunes,  or flushes, the flows from the firewall table.  While the flush completes, impacted flows are processed as midstream traffic. This may result in a  temporary increase in midstream traffic metrics. We recommend that you double check your stream exception policy  before you perform a flush operation.
    ///
    /// Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowFilters: Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - minimumFlowAgeInSeconds: The reqested FlowOperation ignores flows with an age (in seconds) lower than MinimumFlowAgeInSeconds.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func startFlowFlush(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowFilters: [FlowFilter],
        minimumFlowAgeInSeconds: Int? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartFlowFlushResponse {
        let input = StartFlowFlushRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowFilters: flowFilters, 
            minimumFlowAgeInSeconds: minimumFlowAgeInSeconds, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return try await self.startFlowFlush(input, logger: logger)
    }

    /// Adds the specified tags to the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can tag the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds the specified tags to the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can tag the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes the tags with the specified keys from the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can manage tags for the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the tags with the specified keys from the specified resource. Tags are key:value pairs that you can use to categorize and manage your resources, for purposes like billing. For example, you might set the tag key to "customer" and the value to the customer name or ID. You can specify one or more tags to add to each Amazon Web Services resource, up to 50 tags for a resource. You can manage tags for the Amazon Web Services resources that you manage through Network Firewall: firewalls, firewall policies, and rule groups.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - tagKeys: 
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Modifies the AvailabilityZoneChangeProtection setting for a transit gateway-attached firewall. When enabled, this setting prevents accidental changes to the firewall's Availability Zone configuration. This helps protect against disrupting traffic flow in production environments. When enabled, you must disable this protection before using AssociateAvailabilityZones or DisassociateAvailabilityZones to modify the firewall's Availability Zone configuration.
    @Sendable
    @inlinable
    public func updateAvailabilityZoneChangeProtection(_ input: UpdateAvailabilityZoneChangeProtectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAvailabilityZoneChangeProtectionResponse {
        try await self.client.execute(
            operation: "UpdateAvailabilityZoneChangeProtection", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the AvailabilityZoneChangeProtection setting for a transit gateway-attached firewall. When enabled, this setting prevents accidental changes to the firewall's Availability Zone configuration. This helps protect against disrupting traffic flow in production environments. When enabled, you must disable this protection before using AssociateAvailabilityZones or DisassociateAvailabilityZones to modify the firewall's Availability Zone configuration.
    ///
    /// Parameters:
    ///   - availabilityZoneChangeProtection: A setting indicating whether the firewall is protected against changes to the subnet associations. Use this setting to protect against accidentally modifying the subnet associations for a firewall that is in use. When you create a firewall, the operation initializes this setting to TRUE.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAvailabilityZoneChangeProtection(
        availabilityZoneChangeProtection: Bool = false,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAvailabilityZoneChangeProtectionResponse {
        let input = UpdateAvailabilityZoneChangeProtectionRequest(
            availabilityZoneChangeProtection: availabilityZoneChangeProtection, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.updateAvailabilityZoneChangeProtection(input, logger: logger)
    }

    /// Enables specific types of firewall analysis on a specific firewall you define.
    @Sendable
    @inlinable
    public func updateFirewallAnalysisSettings(_ input: UpdateFirewallAnalysisSettingsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallAnalysisSettingsResponse {
        try await self.client.execute(
            operation: "UpdateFirewallAnalysisSettings", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Enables specific types of firewall analysis on a specific firewall you define.
    ///
    /// Parameters:
    ///   - enabledAnalysisTypes: An optional setting indicating the specific traffic analysis types to enable on the firewall.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallAnalysisSettings(
        enabledAnalysisTypes: [EnabledAnalysisType]? = nil,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallAnalysisSettingsResponse {
        let input = UpdateFirewallAnalysisSettingsRequest(
            enabledAnalysisTypes: enabledAnalysisTypes, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.updateFirewallAnalysisSettings(input, logger: logger)
    }

    /// Modifies the flag, DeleteProtection, which indicates whether it is possible to delete the firewall. If the flag is set to TRUE, the firewall is protected against deletion. This setting helps protect against accidentally deleting a firewall that's in use.
    @Sendable
    @inlinable
    public func updateFirewallDeleteProtection(_ input: UpdateFirewallDeleteProtectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallDeleteProtectionResponse {
        try await self.client.execute(
            operation: "UpdateFirewallDeleteProtection", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the flag, DeleteProtection, which indicates whether it is possible to delete the firewall. If the flag is set to TRUE, the firewall is protected against deletion. This setting helps protect against accidentally deleting a firewall that's in use.
    ///
    /// Parameters:
    ///   - deleteProtection: A flag indicating whether it is possible to delete the firewall. A setting of TRUE indicates that the firewall is protected against deletion. Use this setting to protect against accidentally deleting a firewall that is in use. When you create a firewall, the operation initializes this flag to TRUE.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallDeleteProtection(
        deleteProtection: Bool = false,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallDeleteProtectionResponse {
        let input = UpdateFirewallDeleteProtectionRequest(
            deleteProtection: deleteProtection, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.updateFirewallDeleteProtection(input, logger: logger)
    }

    /// Modifies the description for the specified firewall. Use the description to help you identify the firewall when you're working with it.
    @Sendable
    @inlinable
    public func updateFirewallDescription(_ input: UpdateFirewallDescriptionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallDescriptionResponse {
        try await self.client.execute(
            operation: "UpdateFirewallDescription", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the description for the specified firewall. Use the description to help you identify the firewall when you're working with it.
    ///
    /// Parameters:
    ///   - description: The new description for the firewall. If you omit this setting, Network Firewall removes the description for the firewall.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallDescription(
        description: String? = nil,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallDescriptionResponse {
        let input = UpdateFirewallDescriptionRequest(
            description: description, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.updateFirewallDescription(input, logger: logger)
    }

    /// A complex type that contains settings for encryption of your firewall resources.
    @Sendable
    @inlinable
    public func updateFirewallEncryptionConfiguration(_ input: UpdateFirewallEncryptionConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallEncryptionConfigurationResponse {
        try await self.client.execute(
            operation: "UpdateFirewallEncryptionConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// A complex type that contains settings for encryption of your firewall resources.
    ///
    /// Parameters:
    ///   - encryptionConfiguration: 
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallEncryptionConfiguration(
        encryptionConfiguration: EncryptionConfiguration? = nil,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallEncryptionConfigurationResponse {
        let input = UpdateFirewallEncryptionConfigurationRequest(
            encryptionConfiguration: encryptionConfiguration, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            updateToken: updateToken
        )
        return try await self.updateFirewallEncryptionConfiguration(input, logger: logger)
    }

    /// Updates the properties of the specified firewall policy.
    @Sendable
    @inlinable
    public func updateFirewallPolicy(_ input: UpdateFirewallPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallPolicyResponse {
        try await self.client.execute(
            operation: "UpdateFirewallPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the properties of the specified firewall policy.
    ///
    /// Parameters:
    ///   - description: A description of the firewall policy.
    ///   - dryRun: Indicates whether you want Network Firewall to just check the validity of the request, rather than run the request.  If set to TRUE, Network Firewall checks whether the request can run successfully, but doesn't actually make the requested changes. The call returns the value that the request would return if you ran it with dry run set to FALSE, but doesn't make additions or changes to your resources. This option allows you to make sure that you have the required permissions to run the request and that your request parameters are valid.  If set to FALSE, Network Firewall makes the requested changes to your resources.
    ///   - encryptionConfiguration: A complex type that contains settings for encryption of your firewall policy resources.
    ///   - firewallPolicy: The updated firewall policy to use for the firewall. You can't add or remove a TLSInspectionConfiguration after you create a firewall policy. However, you can replace an existing TLS inspection configuration with another TLSInspectionConfiguration.
    ///   - firewallPolicyArn: The Amazon Resource Name (ARN) of the firewall policy. You must specify the ARN or the name, and you can specify both.
    ///   - firewallPolicyName: The descriptive name of the firewall policy. You can't change the name of a firewall policy after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - updateToken: A token used for optimistic locking. Network Firewall returns a token to your requests that access the firewall policy. The token marks the state of the policy resource at the time of the request.  To make changes to the policy, you provide the token in your request. Network Firewall uses the token to ensure that the policy hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall policy again to get a current copy of it with current token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallPolicy(
        description: String? = nil,
        dryRun: Bool? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        firewallPolicy: FirewallPolicy,
        firewallPolicyArn: String? = nil,
        firewallPolicyName: String? = nil,
        updateToken: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallPolicyResponse {
        let input = UpdateFirewallPolicyRequest(
            description: description, 
            dryRun: dryRun, 
            encryptionConfiguration: encryptionConfiguration, 
            firewallPolicy: firewallPolicy, 
            firewallPolicyArn: firewallPolicyArn, 
            firewallPolicyName: firewallPolicyName, 
            updateToken: updateToken
        )
        return try await self.updateFirewallPolicy(input, logger: logger)
    }

    /// Modifies the flag, ChangeProtection, which indicates whether it is possible to change the firewall. If the flag is set to TRUE, the firewall is protected from changes. This setting helps protect against accidentally changing a firewall that's in use.
    @Sendable
    @inlinable
    public func updateFirewallPolicyChangeProtection(_ input: UpdateFirewallPolicyChangeProtectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFirewallPolicyChangeProtectionResponse {
        try await self.client.execute(
            operation: "UpdateFirewallPolicyChangeProtection", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Modifies the flag, ChangeProtection, which indicates whether it is possible to change the firewall. If the flag is set to TRUE, the firewall is protected from changes. This setting helps protect against accidentally changing a firewall that's in use.
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - firewallPolicyChangeProtection: A setting indicating whether the firewall is protected against a change to the firewall policy association. Use this setting to protect against accidentally modifying the firewall policy for a firewall that is in use. When you create a firewall, the operation initializes this setting to TRUE.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFirewallPolicyChangeProtection(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        firewallPolicyChangeProtection: Bool = false,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFirewallPolicyChangeProtectionResponse {
        let input = UpdateFirewallPolicyChangeProtectionRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            firewallPolicyChangeProtection: firewallPolicyChangeProtection, 
            updateToken: updateToken
        )
        return try await self.updateFirewallPolicyChangeProtection(input, logger: logger)
    }

    /// Sets the logging configuration for the specified firewall.  To change the logging configuration, retrieve the LoggingConfiguration by calling DescribeLoggingConfiguration, then change it and provide the modified object to this update call. You must change the logging configuration one LogDestinationConfig at a time inside the retrieved LoggingConfiguration object.  You can perform only one of the following actions in any call to UpdateLoggingConfiguration:    Create a new log destination object by adding a single LogDestinationConfig array element to LogDestinationConfigs.   Delete a log destination object by removing a single LogDestinationConfig array element from LogDestinationConfigs.   Change the LogDestination setting in a single LogDestinationConfig array element.   You can't change the LogDestinationType or LogType in a LogDestinationConfig. To change these settings, delete the existing LogDestinationConfig object and create a new one, using two separate calls to this update operation.
    @Sendable
    @inlinable
    public func updateLoggingConfiguration(_ input: UpdateLoggingConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLoggingConfigurationResponse {
        try await self.client.execute(
            operation: "UpdateLoggingConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets the logging configuration for the specified firewall.  To change the logging configuration, retrieve the LoggingConfiguration by calling DescribeLoggingConfiguration, then change it and provide the modified object to this update call. You must change the logging configuration one LogDestinationConfig at a time inside the retrieved LoggingConfiguration object.  You can perform only one of the following actions in any call to UpdateLoggingConfiguration:    Create a new log destination object by adding a single LogDestinationConfig array element to LogDestinationConfigs.   Delete a log destination object by removing a single LogDestinationConfig array element from LogDestinationConfigs.   Change the LogDestination setting in a single LogDestinationConfig array element.   You can't change the LogDestinationType or LogType in a LogDestinationConfig. To change these settings, delete the existing LogDestinationConfig object and create a new one, using two separate calls to this update operation.
    ///
    /// Parameters:
    ///   - enableMonitoringDashboard: A boolean that lets you enable or disable the detailed firewall monitoring dashboard on the firewall.  The monitoring dashboard provides comprehensive visibility into your firewall's flow logs and alert logs.  After you enable detailed monitoring, you can access these dashboards directly from the Monitoring page of the Network Firewall console.  Specify TRUE to enable the the detailed monitoring dashboard on the firewall.  Specify FALSE to disable the the detailed monitoring dashboard on the firewall.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - loggingConfiguration: Defines how Network Firewall performs logging for a firewall. If you omit this setting, Network Firewall disables logging for the firewall.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLoggingConfiguration(
        enableMonitoringDashboard: Bool? = nil,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        loggingConfiguration: LoggingConfiguration? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLoggingConfigurationResponse {
        let input = UpdateLoggingConfigurationRequest(
            enableMonitoringDashboard: enableMonitoringDashboard, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            loggingConfiguration: loggingConfiguration
        )
        return try await self.updateLoggingConfiguration(input, logger: logger)
    }

    /// Updates the rule settings for the specified rule group. You use a rule group by reference in one or more firewall policies. When you modify a rule group, you modify all firewall policies that use the rule group.  To update a rule group, first call DescribeRuleGroup to retrieve the current RuleGroup object, update the object as needed, and then provide the updated object to this call.
    @Sendable
    @inlinable
    public func updateRuleGroup(_ input: UpdateRuleGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateRuleGroupResponse {
        try await self.client.execute(
            operation: "UpdateRuleGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the rule settings for the specified rule group. You use a rule group by reference in one or more firewall policies. When you modify a rule group, you modify all firewall policies that use the rule group.  To update a rule group, first call DescribeRuleGroup to retrieve the current RuleGroup object, update the object as needed, and then provide the updated object to this call.
    ///
    /// Parameters:
    ///   - analyzeRuleGroup: Indicates whether you want Network Firewall to analyze the stateless rules in the rule group for rule behavior such as asymmetric routing. If set to TRUE, Network Firewall runs the analysis and then updates the rule group for you. To run the stateless rule group analyzer without updating the rule group, set DryRun to TRUE.
    ///   - description: A description of the rule group.
    ///   - dryRun: Indicates whether you want Network Firewall to just check the validity of the request, rather than run the request.  If set to TRUE, Network Firewall checks whether the request can run successfully, but doesn't actually make the requested changes. The call returns the value that the request would return if you ran it with dry run set to FALSE, but doesn't make additions or changes to your resources. This option allows you to make sure that you have the required permissions to run the request and that your request parameters are valid.  If set to FALSE, Network Firewall makes the requested changes to your resources.
    ///   - encryptionConfiguration: A complex type that contains settings for encryption of your rule group resources.
    ///   - ruleGroup: An object that defines the rule group rules.   You must provide either this rule group setting or a Rules setting, but not both.
    ///   - ruleGroupArn: The Amazon Resource Name (ARN) of the rule group. You must specify the ARN or the name, and you can specify both.
    ///   - ruleGroupName: The descriptive name of the rule group. You can't change the name of a rule group after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - rules: A string containing stateful rule group rules specifications in Suricata flat format, with one rule
    ///   - sourceMetadata: A complex type that contains metadata about the rule group that your own rule group is copied from. You can use the metadata to keep track of updates made to the originating rule group.
    ///   - summaryConfiguration: Updates the selected summary configuration for a rule group. Changes affect subsequent responses from DescribeRuleGroupSummary.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains
    ///   - updateToken: A token used for optimistic locking. Network Firewall returns a token to your requests that access the rule group. The token marks the state of the rule group resource at the time of the request.  To make changes to the rule group, you provide the token in your request. Network Firewall uses the token to ensure that the rule group hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the rule group again to get a current copy of it with a current token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateRuleGroup(
        analyzeRuleGroup: Bool? = nil,
        description: String? = nil,
        dryRun: Bool? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        ruleGroup: RuleGroup? = nil,
        ruleGroupArn: String? = nil,
        ruleGroupName: String? = nil,
        rules: String? = nil,
        sourceMetadata: SourceMetadata? = nil,
        summaryConfiguration: SummaryConfiguration? = nil,
        type: RuleGroupType? = nil,
        updateToken: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateRuleGroupResponse {
        let input = UpdateRuleGroupRequest(
            analyzeRuleGroup: analyzeRuleGroup, 
            description: description, 
            dryRun: dryRun, 
            encryptionConfiguration: encryptionConfiguration, 
            ruleGroup: ruleGroup, 
            ruleGroupArn: ruleGroupArn, 
            ruleGroupName: ruleGroupName, 
            rules: rules, 
            sourceMetadata: sourceMetadata, 
            summaryConfiguration: summaryConfiguration, 
            type: type, 
            updateToken: updateToken
        )
        return try await self.updateRuleGroup(input, logger: logger)
    }

    @Sendable
    @inlinable
    public func updateSubnetChangeProtection(_ input: UpdateSubnetChangeProtectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateSubnetChangeProtectionResponse {
        try await self.client.execute(
            operation: "UpdateSubnetChangeProtection", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///
    /// Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - subnetChangeProtection: A setting indicating whether the firewall is protected against changes to the subnet associations. Use this setting to protect against accidentally modifying the subnet associations for a firewall that is in use. When you create a firewall, the operation initializes this setting to TRUE.
    ///   - updateToken: An optional token that you can use for optimistic locking. Network Firewall returns a token to your requests that access the firewall. The token marks the state of the firewall resource at the time of the request.  To make an unconditional change to the firewall, omit the token in your update request. Without the token, Network Firewall performs your updates regardless of whether the firewall has changed since you last retrieved it. To make a conditional change to the firewall, provide the token in your update request. Network Firewall uses the token to ensure that the firewall hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the firewall again to get a current copy of it with a new token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateSubnetChangeProtection(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        subnetChangeProtection: Bool = false,
        updateToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateSubnetChangeProtectionResponse {
        let input = UpdateSubnetChangeProtectionRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            subnetChangeProtection: subnetChangeProtection, 
            updateToken: updateToken
        )
        return try await self.updateSubnetChangeProtection(input, logger: logger)
    }

    /// Updates the TLS inspection configuration settings for the specified TLS inspection configuration. You use a TLS inspection configuration by referencing it in one or more firewall policies. When you modify a TLS inspection configuration, you modify all firewall policies that use the TLS inspection configuration.  To update a TLS inspection configuration, first call DescribeTLSInspectionConfiguration to retrieve the current TLSInspectionConfiguration object, update the object as needed, and then provide the updated object to this call.
    @Sendable
    @inlinable
    public func updateTLSInspectionConfiguration(_ input: UpdateTLSInspectionConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateTLSInspectionConfigurationResponse {
        try await self.client.execute(
            operation: "UpdateTLSInspectionConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the TLS inspection configuration settings for the specified TLS inspection configuration. You use a TLS inspection configuration by referencing it in one or more firewall policies. When you modify a TLS inspection configuration, you modify all firewall policies that use the TLS inspection configuration.  To update a TLS inspection configuration, first call DescribeTLSInspectionConfiguration to retrieve the current TLSInspectionConfiguration object, update the object as needed, and then provide the updated object to this call.
    ///
    /// Parameters:
    ///   - description: A description of the TLS inspection configuration.
    ///   - encryptionConfiguration: A complex type that contains the Amazon Web Services KMS encryption configuration settings for your TLS inspection configuration.
    ///   - tlsInspectionConfiguration: The object that defines a TLS inspection configuration. This, along with TLSInspectionConfigurationResponse, define the TLS inspection configuration. You can retrieve all objects for a TLS inspection configuration by calling DescribeTLSInspectionConfiguration.  Network Firewall uses a TLS inspection configuration to decrypt traffic. Network Firewall re-encrypts the traffic before sending it to its destination. To use a TLS inspection configuration, you add it to a new Network Firewall firewall policy, then you apply the firewall policy to a firewall. Network Firewall acts as a proxy service to decrypt and inspect the traffic traveling through your firewalls. You can reference a TLS inspection configuration from more than one firewall policy, and you can use a firewall policy in more than one firewall. For more information about using TLS inspection configurations, see  Inspecting SSL/TLS traffic with TLS
    ///   - tlsInspectionConfigurationArn: The Amazon Resource Name (ARN) of the TLS inspection configuration.
    ///   - tlsInspectionConfigurationName: The descriptive name of the TLS inspection configuration. You can't change the name of a TLS inspection configuration after you create it.
    ///   - updateToken: A token used for optimistic locking. Network Firewall returns a token to your requests that access the TLS inspection configuration. The token marks the state of the TLS inspection configuration resource at the time of the request.  To make changes to the TLS inspection configuration, you provide the token in your request. Network Firewall uses the token to ensure that the TLS inspection configuration hasn't changed since you last retrieved it. If it has changed, the operation fails with an InvalidTokenException. If this happens, retrieve the TLS inspection configuration again to get a current copy of it with a current token. Reapply your changes as needed, then try the operation again using the new token.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateTLSInspectionConfiguration(
        description: String? = nil,
        encryptionConfiguration: EncryptionConfiguration? = nil,
        tlsInspectionConfiguration: TLSInspectionConfiguration,
        tlsInspectionConfigurationArn: String? = nil,
        tlsInspectionConfigurationName: String? = nil,
        updateToken: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateTLSInspectionConfigurationResponse {
        let input = UpdateTLSInspectionConfigurationRequest(
            description: description, 
            encryptionConfiguration: encryptionConfiguration, 
            tlsInspectionConfiguration: tlsInspectionConfiguration, 
            tlsInspectionConfigurationArn: tlsInspectionConfigurationArn, 
            tlsInspectionConfigurationName: tlsInspectionConfigurationName, 
            updateToken: updateToken
        )
        return try await self.updateTLSInspectionConfiguration(input, logger: logger)
    }
}

extension NetworkFirewall {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: NetworkFirewall, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension NetworkFirewall {
    /// Return PaginatorSequence for operation ``getAnalysisReportResults(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func getAnalysisReportResultsPaginator(
        _ input: GetAnalysisReportResultsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<GetAnalysisReportResultsRequest, GetAnalysisReportResultsResponse> {
        return .init(
            input: input,
            command: self.getAnalysisReportResults,
            inputKey: \GetAnalysisReportResultsRequest.nextToken,
            outputKey: \GetAnalysisReportResultsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``getAnalysisReportResults(_:logger:)``.
    ///
    /// - Parameters:
    ///   - analysisReportId: The unique ID of the query that ran when you requested an analysis report.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - logger: Logger used for logging
    @inlinable
    public func getAnalysisReportResultsPaginator(
        analysisReportId: String,
        firewallArn: String? = nil,
        firewallName: String? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<GetAnalysisReportResultsRequest, GetAnalysisReportResultsResponse> {
        let input = GetAnalysisReportResultsRequest(
            analysisReportId: analysisReportId, 
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            maxResults: maxResults
        )
        return self.getAnalysisReportResultsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listAnalysisReports(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAnalysisReportsPaginator(
        _ input: ListAnalysisReportsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAnalysisReportsRequest, ListAnalysisReportsResponse> {
        return .init(
            input: input,
            command: self.listAnalysisReports,
            inputKey: \ListAnalysisReportsRequest.nextToken,
            outputKey: \ListAnalysisReportsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAnalysisReports(_:logger:)``.
    ///
    /// - Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. You must specify the ARN or the name, and you can specify both.
    ///   - firewallName: The descriptive name of the firewall. You can't change the name of a firewall after you create it. You must specify the ARN or the name, and you can specify both.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAnalysisReportsPaginator(
        firewallArn: String? = nil,
        firewallName: String? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAnalysisReportsRequest, ListAnalysisReportsResponse> {
        let input = ListAnalysisReportsRequest(
            firewallArn: firewallArn, 
            firewallName: firewallName, 
            maxResults: maxResults
        )
        return self.listAnalysisReportsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFirewallPolicies(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFirewallPoliciesPaginator(
        _ input: ListFirewallPoliciesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFirewallPoliciesRequest, ListFirewallPoliciesResponse> {
        return .init(
            input: input,
            command: self.listFirewallPolicies,
            inputKey: \ListFirewallPoliciesRequest.nextToken,
            outputKey: \ListFirewallPoliciesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFirewallPolicies(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFirewallPoliciesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFirewallPoliciesRequest, ListFirewallPoliciesResponse> {
        let input = ListFirewallPoliciesRequest(
            maxResults: maxResults
        )
        return self.listFirewallPoliciesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFirewalls(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFirewallsPaginator(
        _ input: ListFirewallsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFirewallsRequest, ListFirewallsResponse> {
        return .init(
            input: input,
            command: self.listFirewalls,
            inputKey: \ListFirewallsRequest.nextToken,
            outputKey: \ListFirewallsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFirewalls(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - vpcIds: The unique identifiers of the VPCs that you want Network Firewall to retrieve the firewalls for. Leave this blank to retrieve all firewalls that you have defined.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFirewallsPaginator(
        maxResults: Int? = nil,
        vpcIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFirewallsRequest, ListFirewallsResponse> {
        let input = ListFirewallsRequest(
            maxResults: maxResults, 
            vpcIds: vpcIds
        )
        return self.listFirewallsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFlowOperationResults(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFlowOperationResultsPaginator(
        _ input: ListFlowOperationResultsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFlowOperationResultsRequest, ListFlowOperationResultsResponse> {
        return .init(
            input: input,
            command: self.listFlowOperationResults,
            inputKey: \ListFlowOperationResultsRequest.nextToken,
            outputKey: \ListFlowOperationResultsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFlowOperationResults(_:logger:)``.
    ///
    /// - Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowOperationId: A unique identifier for the flow operation. This ID is returned in the responses to start and list commands. You provide to describe commands.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFlowOperationResultsPaginator(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowOperationId: String,
        maxResults: Int? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFlowOperationResultsRequest, ListFlowOperationResultsResponse> {
        let input = ListFlowOperationResultsRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowOperationId: flowOperationId, 
            maxResults: maxResults, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return self.listFlowOperationResultsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFlowOperations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFlowOperationsPaginator(
        _ input: ListFlowOperationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFlowOperationsRequest, ListFlowOperationsResponse> {
        return .init(
            input: input,
            command: self.listFlowOperations,
            inputKey: \ListFlowOperationsRequest.nextToken,
            outputKey: \ListFlowOperationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFlowOperations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - availabilityZone: The ID of the Availability Zone where the firewall is located. For example, us-east-2a. Defines the scope a flow operation. You can use up to 20 filters to configure a single flow operation.
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall.
    ///   - flowOperationType: An optional string that defines whether any or all operation types are returned.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - vpcEndpointAssociationArn: The Amazon Resource Name (ARN) of a VPC endpoint association.
    ///   - vpcEndpointId: A unique identifier for the primary endpoint associated with a firewall.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFlowOperationsPaginator(
        availabilityZone: String? = nil,
        firewallArn: String,
        flowOperationType: FlowOperationType? = nil,
        maxResults: Int? = nil,
        vpcEndpointAssociationArn: String? = nil,
        vpcEndpointId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFlowOperationsRequest, ListFlowOperationsResponse> {
        let input = ListFlowOperationsRequest(
            availabilityZone: availabilityZone, 
            firewallArn: firewallArn, 
            flowOperationType: flowOperationType, 
            maxResults: maxResults, 
            vpcEndpointAssociationArn: vpcEndpointAssociationArn, 
            vpcEndpointId: vpcEndpointId
        )
        return self.listFlowOperationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listRuleGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listRuleGroupsPaginator(
        _ input: ListRuleGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListRuleGroupsRequest, ListRuleGroupsResponse> {
        return .init(
            input: input,
            command: self.listRuleGroups,
            inputKey: \ListRuleGroupsRequest.nextToken,
            outputKey: \ListRuleGroupsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listRuleGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - managedType: Indicates the general category of the Amazon Web Services managed rule group.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - scope: The scope of the request. The default setting of ACCOUNT or a setting of NULL returns all of the rule groups in your account. A setting of MANAGED returns all available managed rule groups.
    ///   - type: Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains stateless rules. If it is stateful, it contains stateful rules.
    ///   - logger: Logger used for logging
    @inlinable
    public func listRuleGroupsPaginator(
        managedType: ResourceManagedType? = nil,
        maxResults: Int? = nil,
        scope: ResourceManagedStatus? = nil,
        type: RuleGroupType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListRuleGroupsRequest, ListRuleGroupsResponse> {
        let input = ListRuleGroupsRequest(
            managedType: managedType, 
            maxResults: maxResults, 
            scope: scope, 
            type: type
        )
        return self.listRuleGroupsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTLSInspectionConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTLSInspectionConfigurationsPaginator(
        _ input: ListTLSInspectionConfigurationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTLSInspectionConfigurationsRequest, ListTLSInspectionConfigurationsResponse> {
        return .init(
            input: input,
            command: self.listTLSInspectionConfigurations,
            inputKey: \ListTLSInspectionConfigurationsRequest.nextToken,
            outputKey: \ListTLSInspectionConfigurationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTLSInspectionConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTLSInspectionConfigurationsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTLSInspectionConfigurationsRequest, ListTLSInspectionConfigurationsResponse> {
        let input = ListTLSInspectionConfigurationsRequest(
            maxResults: maxResults
        )
        return self.listTLSInspectionConfigurationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTagsForResource(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTagsForResourcePaginator(
        _ input: ListTagsForResourceRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTagsForResourceRequest, ListTagsForResourceResponse> {
        return .init(
            input: input,
            command: self.listTagsForResource,
            inputKey: \ListTagsForResourceRequest.nextToken,
            outputKey: \ListTagsForResourceResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTagsForResource(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTagsForResourcePaginator(
        maxResults: Int? = nil,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTagsForResourceRequest, ListTagsForResourceResponse> {
        let input = ListTagsForResourceRequest(
            maxResults: maxResults, 
            resourceArn: resourceArn
        )
        return self.listTagsForResourcePaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listVpcEndpointAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listVpcEndpointAssociationsPaginator(
        _ input: ListVpcEndpointAssociationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListVpcEndpointAssociationsRequest, ListVpcEndpointAssociationsResponse> {
        return .init(
            input: input,
            command: self.listVpcEndpointAssociations,
            inputKey: \ListVpcEndpointAssociationsRequest.nextToken,
            outputKey: \ListVpcEndpointAssociationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listVpcEndpointAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - firewallArn: The Amazon Resource Name (ARN) of the firewall. If you don't specify this, Network Firewall retrieves all VPC endpoint associations that you have defined.
    ///   - maxResults: The maximum number of objects that you want Network Firewall to return for this request. If more objects are available, in the response, Network Firewall provides a NextToken value that you can use in a subsequent call to get the next batch of objects.
    ///   - logger: Logger used for logging
    @inlinable
    public func listVpcEndpointAssociationsPaginator(
        firewallArn: String? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListVpcEndpointAssociationsRequest, ListVpcEndpointAssociationsResponse> {
        let input = ListVpcEndpointAssociationsRequest(
            firewallArn: firewallArn, 
            maxResults: maxResults
        )
        return self.listVpcEndpointAssociationsPaginator(input, logger: logger)
    }
}

extension NetworkFirewall.GetAnalysisReportResultsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.GetAnalysisReportResultsRequest {
        return .init(
            analysisReportId: self.analysisReportId,
            firewallArn: self.firewallArn,
            firewallName: self.firewallName,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension NetworkFirewall.ListAnalysisReportsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListAnalysisReportsRequest {
        return .init(
            firewallArn: self.firewallArn,
            firewallName: self.firewallName,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension NetworkFirewall.ListFirewallPoliciesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListFirewallPoliciesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension NetworkFirewall.ListFirewallsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListFirewallsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            vpcIds: self.vpcIds
        )
    }
}

extension NetworkFirewall.ListFlowOperationResultsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListFlowOperationResultsRequest {
        return .init(
            availabilityZone: self.availabilityZone,
            firewallArn: self.firewallArn,
            flowOperationId: self.flowOperationId,
            maxResults: self.maxResults,
            nextToken: token,
            vpcEndpointAssociationArn: self.vpcEndpointAssociationArn,
            vpcEndpointId: self.vpcEndpointId
        )
    }
}

extension NetworkFirewall.ListFlowOperationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListFlowOperationsRequest {
        return .init(
            availabilityZone: self.availabilityZone,
            firewallArn: self.firewallArn,
            flowOperationType: self.flowOperationType,
            maxResults: self.maxResults,
            nextToken: token,
            vpcEndpointAssociationArn: self.vpcEndpointAssociationArn,
            vpcEndpointId: self.vpcEndpointId
        )
    }
}

extension NetworkFirewall.ListRuleGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListRuleGroupsRequest {
        return .init(
            managedType: self.managedType,
            maxResults: self.maxResults,
            nextToken: token,
            scope: self.scope,
            type: self.type
        )
    }
}

extension NetworkFirewall.ListTLSInspectionConfigurationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListTLSInspectionConfigurationsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension NetworkFirewall.ListTagsForResourceRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListTagsForResourceRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            resourceArn: self.resourceArn
        )
    }
}

extension NetworkFirewall.ListVpcEndpointAssociationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> NetworkFirewall.ListVpcEndpointAssociationsRequest {
        return .init(
            firewallArn: self.firewallArn,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
